﻿#pragma once
#include "zyCustomCtrol.h"
#include "zyLmageList.h"

namespace DarkMoonUI {
#define zyLBM_STRING 1
#define zyLBM_IMAGE 2
#define zyLBM_STATE 4
#define zyLBM_HEIGHT 8
#define zyLBM_LPARAM 16
#define zyLBM_COLOR 32
#define zyLBM_SELCOLOR 64

#define zyLBS_CHECKED 65536
#define zyLBS_DISABLE 131072

#define BP_PUSHBUTTON 1
#define BP_CHECKBOX 3

#define CBS_UNCHECKEDNORMAL 1
#define CBS_UNCHECKEDHOT 2
#define CBS_UNCHECKEDPRESSED 3
#define CBS_UNCHECKEDDISABLED 4
#define CBS_CHECKEDNORMAL 5
#define CBS_CHECKEDHOT 6
#define CBS_CHECKEDPRESSED 7
#define CBS_CHECKEDDISABLED 8
	class zyListBoxEx : public  zyCustomCtrol
	{
	public:
		struct zyListBoxItem {
			DWORD  mask;
			int id;
			std::wstring  lpString;
			int iImage;
			Gdiplus::Image* Image;
			int ImageWidth;
			int ImageHeight;
			int NoImageList;
			int state;
			int stateMask;
			int height;
			Color  textColor;
			Color  backColor;
			Color  selTextColor;
			Color  selBackColor;
			int marginChecked;
			int marginImage;
			int marginText;
			LPARAM  lParam;
		};
	public:
		zyListBoxEx();
		~zyListBoxEx();
		static void  WINAPI zyListBoxEx_Destroy(zyObject* obj);
		static LRESULT WINAPI zyListBoxEx_WndProc(zyObject* obj, HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL* bHandled);
		static LRESULT WINAPI zyListBoxEx_ChildWndProc(zyObject* obj, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, BOOL* bHandle);

		BOOL 创建(HWND 参数_父窗口, const std::wstring& 参数_标题 = L"", POINT 参数_位置 = POINT{ 0, 0 }, POINT 参数_尺寸 = POINT{ 60, 120 },
			int 参数_ID = 0, int 参数_窗口风格 = 0, int 参数_扩展风格 = 0);
		BOOL 创建(zyWindow& 参数_父窗口, const std::wstring& 参数_标题 = L"", POINT 参数_位置 = POINT{ 0, 0 }, POINT 参数_尺寸 = POINT{ 60, 120 },
			int 参数_ID = 0, int 参数_窗口风格 = 0, int 参数_扩展风格 = 0);
		int 加入项目(const std::wstring& 参数_项目文本, int 参数_项目数值 = 0, int 参数_图片索引 = -1, int 参数_项目高度 = 20);
		int 插入项目(const std::wstring& 参数_项目文本, int 参数_插入位置 = -1, int 参数_项目数值 = 0, int 参数_图片索引 = -1, int 参数_项目高度 = 20);
		bool 删除项目(int 参数_项目索引);
		bool 清空();
		bool 显示检查框(bool 参数_显示检查框);
		void 置图片组(zyLmageList& 参数_图片组);
		zyLmageList 取图片组();
		void 重画项目(int 参数_索引);
		bool 置图片(int 参数_索引, Gdiplus::Image* 参数_图片, int 参数_图片宽度, int 参数_图片高度);
		Gdiplus::Image* 取图片(int 参数_索引);
		bool 置图片索引(int 参数_索引, int 参数_图片索引);
		int 取图片索引(int 参数_索引);
		std::wstring 取项目文本(int 参数_索引);
		bool 置项目文本(int 参数_索引, const std::wstring& 参数_项目文本);
		bool 取检查框状态(int 参数_索引);
		bool 置检查框状态(int 参数_索引, bool 参数_检查框状态);
		bool 置项目高度(int 参数_索引, int 参数_高度);
		int 取项目高度(int 参数_索引);
        Gdiplus::Color 取项目文本色(int 参数_索引);
		Gdiplus::Color 置项目文本色(int 参数_索引, Gdiplus::Color 参数_项目文本色);
		Gdiplus::Color 取项目背景色(int 参数_索引);
		Gdiplus::Color 置项目背景色(int 参数_索引, Gdiplus::Color 参数_项目背景色);
		Gdiplus::Color 取选择项目文本色(int 参数_索引);
		Gdiplus::Color 置选择项目文本色(int 参数_索引, Gdiplus::Color 参数_选择项目文本色);
		Gdiplus::Color 取选择项目背景色(int 参数_索引);
		Gdiplus::Color 置选择项目背景色(int 参数_索引, Gdiplus::Color 参数_选择项目背景色);
		LPARAM 取项目数值(int 参数_索引);
		LPARAM 置项目数值(int 参数_索引, LPARAM 参数_项目数值);
		int 置图片缩进距离(int 参数_索引, int 参数_缩进距离);
		int 取图片缩进距离(int 参数_索引);
		int 置文本缩进距离(int 参数_索引, int 参数_缩进距离);
		int 取文本缩进距离(int 参数_索引);
		int 取现行选中项();
		int 置现行选中项(int 参数_项目索引);
		int 查找(const std::wstring& 参数_匹配文本, int 参数_起始索引 = -1);
		int 取项目数();
		bool 是否被选择(int 参数_项目索引);
		int 取已选择项目数();
		int 取所有被选择项(std::vector<int>& 参数_索引数组);
		int 取顶端可见项();
		bool 置顶端可见项(int 参数_项目索引);
		int 取焦点项目();
		bool 置焦点项目(int 参数_项目索引);
		RECT 取项目矩形(int 参数_项目索引);
		int 取坐标项目(int 参数_横坐标, int 参数_纵坐标);
		bool 绘制焦点(bool 参数_绘制焦点);
		//@备注 函数 整型 OnSelCancel(HWND hWnd,整型 id)
		void 事件_列表项被取消选择(TRegEvent* 参数_事件指针) { SetRegEvent(L"OnSelCancel", 参数_事件指针); }
		//@备注 函数 整型 OnSelChange(HWND hWnd,整型 id)
		void 事件_列表项被选择(TRegEvent* 参数_事件指针) { SetRegEvent(L"OnSelChange", 参数_事件指针); }
		//@备注 函数 整型 OnSelCancel(HWND hWnd,整型 id)
		void 事件_双击选择(TRegEvent* 参数_事件指针) { SetRegEvent(L"OnSelCancel", 参数_事件指针); }
	protected:
		void OnNCDestroy();
		void zyListBoxEx_OnDrawItem(HWND hWnd, WPARAM wParam, DRAWITEMSTRUCT* dis);
		void zyListBoxEx_DrawBackColor(Gdiplus::Graphics* graphics, DRAWITEMSTRUCT* dis);
		int zyListBoxEx_DrawCheckBox(HWND hWnd, HDC bg, DRAWITEMSTRUCT* dis);
		void zyListBoxEx_DrawImageAndText(HWND hWnd, HDC hdc, Gdiplus::Graphics* graphics, DRAWITEMSTRUCT* dis, int left);

		void zyListBoxEx_OnMeasureItem(HWND hWnd, LPARAM lParam);
		void zyListBoxEx_OnLButtonUp(HWND hWnd, INT x, INT  y);
		LRESULT zyListBoxEx_OnCompareItem(HWND hWnd, LPARAM lParam);
		void zyListBoxEx_OnDeleteItem(HWND hWnd, LPARAM lParam);
	};

}

